package cn.com.bluemoon.daps.model.service;

import cn.com.bluemoon.daps.common.mp.IBmService;
import cn.com.bluemoon.daps.model.entity.DapDataModelGroup;
import cn.com.bluemoon.daps.model.vo.group.in.GroupTableSearchVo;
import cn.com.bluemoon.daps.model.vo.group.out.GroupModelTableVo;
import cn.com.bluemoon.daps.model.vo.group.out.ModelGroupDto;
import cn.com.bluemoon.daps.model.vo.group.out.ModelLeftGroupOut;
import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;

/**
 * <p>
 * 模型分组表 服务类
 * </p>
 *
 * @author admin
 * @since 2021-02-02
 */
public interface DapDataModelGroupService extends IBmService<DapDataModelGroup> {

    /**
     * 初始化模型创建时候的分组基础信息，用于在新建模型中进行获取
     *
     * @param modelId 模型id
     * @return （若已存在则返回所有，不进行初始化，若不存在则初始化默认组）
     */
    public List<DapDataModelGroup> initModelDefaultGroup(String modelId);

    /**
     * 根据模型id获取分组信息
     */
    List<DapDataModelGroup> findByModelIdOrderByRankAndCreateTime(String modelId);

    /**
     * 新增组
     *
     * @param modelId   模型id
     * @param groupPid  默认组id 组1
     * @param groupName 新增的组 组2名称
     * @param groupRank 组排序号
     * @return 新组带id
     */
    public DapDataModelGroup addGroupByGroupPid(String modelId, String groupPid,
                                                String groupName, int groupRank);

    /**
     * 编辑组
     *
     * @param id        组id
     * @param groupName 组名
     * @param groupRank 修改后对象
     * @return 返回修改后的对象
     */
    public DapDataModelGroup editGroupById(String id, String groupName, int groupRank);

    /**
     * 组id
     *
     * @param id 删除组
     */
    public void delGroupById(String id);

    /**
     * 模型id
     * 1.获取是否为数仓模型
     * 2.进行分组逻辑处理
     * 3.<important>不</important>带有公共模型数据
     *
     * @param modelId 模型id
     * @param keyword 关键字
     * @param nameWithTableSize 节点name是否需要携带表数据量
     * @return modelLeftGroupOut
     */
    ModelLeftGroupOut modelLeftGroup(String modelId, String keyword, boolean nameWithTableSize);

    /**
     * 模型id
     * 1.获取是否为数仓模型
     * 2.进行分组逻辑处理
     * 3.带有公共模型数据
     *
     * @param modelId 模型id
     * @param keyword ky
     * @return modelLeftGroupOut
     */
    ModelLeftGroupOut modelLeftGroupAndCommonModel(String modelId, String keyword);

    /**
     * 根据pid获取子组
     *
     * @param modelId  模型id
     * @param groupPid 分组id
     * @return 组下的自足
     */
    List<DapDataModelGroup> findSonGroupsByModelIdAndRootGroupId(String modelId, String groupPid);

    /**
     * 分组获取当下的表数据
     * 分页
     */
    @SuppressWarnings("rawtypes")
    IPage<GroupModelTableVo> pageModelTablesByGroupId(GroupTableSearchVo searchVo);

    /**
     * 加入组
     *
     * @param tableIds 表ids
     * @param groupId  分组
     */
    void addGroupRelationToTables(List<String> tableIds, String groupId);

    /**
     * 获取组信息+父组信息
     */
    ModelGroupDto getCurrentGroupAndPreGroup(String groupId);

    /**
     * 删除模型下的分组数据
     *
     * @param isLogicDel true逻辑删除
     * @param modelId    模型id
     */
    void deleteByModelId(boolean isLogicDel, String modelId);

    /**
     * 根据模型id+组名称获取id
     * cache
     */
    List<DapDataModelGroup> findGroupByGroupNameAndModelIdCache(String groupName, String modelId);

    /**
     * assert 判断操作的分组和模型是否是模型下的分组数据
     * 不是抛异常
     * 是/组id为空，则检查通过
     *
     * @param groupId 分组
     * @param modelId 模型
     */
    void checkGroupAndModel(String groupId, String modelId);

    /**
     * 批量删除模型分组下的表tableIds
     */
    void batchDeleteTables(List<String> tableIds, String groupId, String modelId);
}
